home *** CD-ROM | disk | FTP | other *** search
/ Nejlepší hry / Nejlepsi hry.iso / hry / plane arcade / planearcade.exe / tank3.bmp / zaloha / model.cpp < prev    next >
C/C++ Source or Header  |  2004-09-19  |  48KB  |  1,786 lines

  1.  
  2. #include "main.h"
  3.  
  4. //------------------------------------------------------------------
  5. // Name: MODEL()
  6. // Desc: konstruktor
  7. //------------------------------------------------------------------
  8. MODEL::MODEL()
  9. {
  10.  
  11.     g_pVB      = NULL; 
  12.     g_pTexture = NULL;  
  13.     g_pEnviroMap = NULL; 
  14.  
  15.     ModelFrame;
  16.  
  17.     Color = GetColor(1.0f,1.0f,1.0f,1.0f);
  18.     Lighting = true ;
  19.     Specular = false ;
  20.     BumpMap = false;
  21.     EnviromentMapping = false;
  22.     MultiTexture = false; 
  23.     OnlyShadow = false;
  24.     Textured = true;
  25.     FrustrumTest = true;
  26.     SmoothShading = true;
  27.     Normals = true;
  28.     Frame = 0.0f;
  29.  
  30.     NumFrames = 0;
  31.     NumFaces = 0;
  32.  
  33.     Pos = Get3D(0.0f,0.0f,0.0f);
  34.     Rot = Get3D(0.0f,0.0f,0.0f);
  35.     Sca = Get3D(1.0f,1.0f,1.0f);
  36. }
  37.  
  38.  
  39. //------------------------------------------------------------------
  40. // Name: ~MODEL()
  41. // Desc: destruktor
  42. //------------------------------------------------------------------
  43. MODEL::~MODEL()
  44. {
  45.  
  46.     if (g_pTexture != NULL)
  47.         g_pTexture->Release();
  48.     g_pTexture = NULL;
  49.  
  50.     if (g_pEnviroMap != NULL)
  51.         g_pEnviroMap->Release();
  52.     g_pEnviroMap = NULL;
  53.  
  54.     if (g_pVB != NULL)
  55.         g_pVB->Release();
  56.     g_pVB = NULL;
  57.  
  58.     //znicmodel
  59.     DestroyModel(&ModelFrame);
  60.  
  61.  
  62. }
  63.  
  64. //------------------------------------------------------------------
  65. // Name: DestroyModel()
  66. // Desc: Znic model
  67. //------------------------------------------------------------------
  68. void MODEL::DestroyModel(MODELFRAME *Mod)
  69. {
  70.  
  71.     if (Mod->FaceList != NULL)
  72.         delete [] Mod->FaceList;
  73.     Mod->FaceList = NULL;
  74.     
  75. }
  76.  
  77. //------------------------------------------------------------------
  78. // Name: InitializeModel()
  79. // Desc: inicializuj model podla poctu trojholnikov
  80. //------------------------------------------------------------------
  81. void MODEL::InitializeModel(MODELFRAME *Mod,int NFaces)
  82. {
  83.     Mod->FaceList = new MODELFACE[NFaces];
  84.     Mod->NumFaces = NFaces;
  85.     Mod->ActFace = 0;
  86.  
  87.     Mod->Centre = Get3D(0.0f,0.0f,0.0f);
  88. }
  89.  
  90. //------------------------------------------------------------------
  91. // Name: GetNumFace()
  92. // Desc: Zisti pocet Face z Ase suboru
  93. //------------------------------------------------------------------
  94. int MODEL::GetNumFace(char *FileName)
  95. {
  96.     FILE *fp;
  97.     char cBuf[80]; 
  98.     int Vys = 0;
  99.     int Pom = 0;
  100.  
  101.     fp = fopen(FileName,"r");
  102.  
  103.     if (fp == NULL)
  104.     {
  105.         sprintf(cBuf,"  Nenasiel som subor %s",FileName);
  106.         LogPrint(cBuf);
  107.     }
  108.  
  109.     while(!feof(fp))
  110.     {
  111.         fscanf(fp,"%s",cBuf);
  112.  
  113.         if (strcmp("*MESH_NUMFACES",cBuf) == 0)
  114.         {
  115.             fscanf(fp,"%d",&Pom);
  116.             Vys = Vys + Pom;
  117.         }
  118.         
  119.     }
  120.  
  121.     fclose(fp);
  122.  
  123.     return Vys;
  124. }
  125.  
  126.  
  127. //------------------------------------------------------------------
  128. // Name: InitializeAse()
  129. // Desc: zinicializuje polia podla Ase modelu
  130. //------------------------------------------------------------------
  131. void MODEL::InitializeAse(int NFrames,char *FileName)
  132. {
  133.  
  134.     char cBuf[80];
  135.     LogPrint("Inicializujem ASE model");
  136.  
  137.     //nacita pocet trojholnikov z Ase suboru
  138.     NumFrames = NFrames;
  139.     NumFaces = GetNumFace(FileName);
  140.     
  141.     sprintf(cBuf,"  NumFrames: %d",NumFrames);
  142.     LogPrint(cBuf);
  143.     sprintf(cBuf,"  NumFaces: %d",NumFaces);
  144.     LogPrint(cBuf);
  145.  
  146.     //inicializuje modelo
  147.     InitializeModel(&ModelFrame,NumFaces);
  148.  
  149.     //vytvaranie vertex buffera
  150.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  151.                                    D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEXMODEL,
  152.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  153.       {
  154.         LogPrint("  Chyba pri vytvarani VB");
  155.     }
  156.     else
  157.     {
  158.         LogPrint("  Vertex Buffer vytvoreny");
  159.     }
  160.  
  161.     
  162. }
  163.  
  164.  
  165. //------------------------------------------------------------------
  166. // Name: LoadAse()
  167. // Desc: loadne ase model
  168. //------------------------------------------------------------------
  169. void MODEL::LoadAse(int IntoFrame,char *FileName)
  170. {
  171.  
  172.  
  173.     FILE *fp;     //subor
  174.     char cBuf[80]; //nacitavanie
  175.  
  176.     fp = fopen(FileName,"r");
  177.  
  178.     if (fp == NULL)
  179.     {
  180.         sprintf(cBuf,"  Nenasiel som subor %s",FileName);
  181.         LogPrint(cBuf);
  182.     }
  183.  
  184.     //ak narazis na GEOMOBJECT nacitaj node
  185.     while(!feof(fp))
  186.     {
  187.         fscanf(fp,"%s",cBuf);
  188.         
  189.         //----------------*GEOMOBJECT----------------
  190.         if (strcmp(cBuf,"*GEOMOBJECT") == 0)
  191.         {
  192.             AddNode(&ModelFrame,fp);
  193.         }
  194.  
  195.         strcpy(cBuf,"");
  196.  
  197.     }
  198.  
  199.     fclose(fp);
  200.  
  201.     //vypocitajminmax
  202.     CalcBoxPoints(&ModelFrame);
  203.  
  204.     //vypocitaj normaly
  205.     if (Normals == true)
  206.         CalcFaceNormals(&ModelFrame);
  207.  
  208.     //vypocitaj smooth shading
  209.     if (SmoothShading == true)
  210.         CalcSmoothShading(&ModelFrame);
  211.  
  212.     //------------------
  213.     // Naplni VB
  214.     //------------------
  215.     int ActVertex = 0;
  216.  
  217.     //pomocne
  218.     int u,i;
  219.     
  220.     //Vertex do ktoreho sa uklada
  221.     CUSTOMVERTEXMODEL *Vertex;
  222.  
  223.     //Otvor VB
  224.     g_pVB->Lock(0, 0, (void**)&Vertex,D3DLOCK_DISCARD ) ;
  225.  
  226.     //zobrazi model do pola vertexov
  227.     for (i = 0;i<NumFaces;i++)
  228.     {
  229.         for (u=0;u<3;u++)
  230.         {
  231.  
  232.             Vertex[ActVertex].pos.x = ModelFrame.FaceList[i].P[u].X;
  233.             Vertex[ActVertex].pos.y = ModelFrame.FaceList[i].P[u].Y;
  234.             Vertex[ActVertex].pos.z = ModelFrame.FaceList[i].P[u].Z;
  235.  
  236.             Vertex[ActVertex].normal.x = ModelFrame.FaceList[i].N[u].X;
  237.             Vertex[ActVertex].normal.y = ModelFrame.FaceList[i].N[u].Y;
  238.             Vertex[ActVertex].normal.z = ModelFrame.FaceList[i].N[u].Z;
  239.         
  240.             Vertex[ActVertex].tu = ModelFrame.FaceList[i].T[u].X;
  241.             Vertex[ActVertex].tv = ModelFrame.FaceList[i].T[u].Y;
  242.         
  243.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  244.                                                 Color.G,
  245.                                                 Color.B,
  246.                                                 Color.A);
  247.  
  248.     
  249.             ActVertex = ActVertex + 1;                
  250.         }    
  251.  
  252.     }
  253.  
  254.  
  255.     //uzavri VB
  256.     g_pVB->Unlock() ;
  257.  
  258. }
  259.  
  260.  
  261. //------------------------------------------------------------------
  262. // Name: AddNode()
  263. // Desc: prida do modelu geom objekt
  264. //------------------------------------------------------------------
  265. void MODEL::AddNode(MODELFRAME *Mod,FILE *fp)
  266. {
  267.  
  268.     //zasobniky vertexov
  269.     VECTOR3D *V = NULL;
  270.     VECTOR3D *T = NULL;
  271.  
  272.     char cBuf[80]; //nacitavanie
  273.  
  274.     int NumV;  //pocet vertexov
  275.     int NumT;  //pocet texture vertexov   
  276.     int NumF;  //pocet facov
  277.  
  278.     D3DXMATRIX RotationMatrix;
  279.     D3DXVECTOR3 RotVector;
  280.     float RotAngle;
  281.  
  282.     while(1==1)
  283.     {
  284.         //nacitaj retazec
  285.         fscanf(fp,"%s",cBuf);
  286.  
  287.         //-----------*TM_ROTAXIS---------------- 
  288.         if (strcmp(cBuf,"*TM_ROTAXIS") == 0)
  289.         {
  290.             fscanf(fp,"%f %f %f",&RotVector.x,&RotVector.z,&RotVector.y);    
  291.         }
  292.  
  293.         //-----------*TM_ROTANGLE---------------
  294.         if (strcmp(cBuf,"*TM_ROTANGLE") == 0)
  295.         {
  296.             fscanf(fp,"%f",&RotAngle);    
  297.  
  298.             //vypocita maticu rotacie
  299.             D3DXMatrixIdentity(&RotationMatrix);     
  300.             D3DXMatrixRotationAxis(&RotationMatrix,&RotVector,RotAngle);
  301.         }
  302.  
  303.         //-----------*MESH_NUMVERTEX------------
  304.         if (strcmp(cBuf,"*MESH_NUMVERTEX") == 0)
  305.         {
  306.             fscanf(fp,"%d",&NumV);    
  307.             V = new VECTOR3D[NumV];
  308.         }
  309.  
  310.         //-----------*MESH_NUMTVERTEX------------
  311.         if (strcmp(cBuf,"*MESH_NUMTVERTEX") == 0)
  312.         {
  313.             fscanf(fp,"%d",&NumT);    
  314.             T = new VECTOR3D[NumT];
  315.         }
  316.         //-----------*MESH_NUMFACES-------------
  317.         if (strcmp(cBuf,"*MESH_NUMFACES") == 0)
  318.         {
  319.             fscanf(fp,"%d",&NumF);    
  320.         }
  321.  
  322.         //-----------*MESH_VERTEX---------------
  323.         if (strcmp(cBuf,"*MESH_VERTEX") == 0)
  324.         {
  325.             int Id;
  326.             float Xs, Ys, Zs;
  327.  
  328.             fscanf(fp,"%d %f %f %f",&Id,&Xs,&Zs,&Ys);
  329.             
  330.             V[Id] = Get3D(Xs,Ys,Zs);
  331.  
  332.         }
  333.  
  334.         //-----------*MESH_FACE-----------------
  335.         if (strcmp(cBuf,"*MESH_FACE") == 0)
  336.         {
  337.             int Id = Mod->ActFace;
  338.  
  339.             int V1,V2,V3;
  340.  
  341.             fscanf(fp,"%s %s %d %s %d %s %d",cBuf,cBuf,&V1,cBuf,&V2,cBuf,&V3);
  342.         
  343.             Mod->FaceList[Id].P[0] = V[V3];
  344.             Mod->FaceList[Id].P[1] = V[V2];
  345.             Mod->FaceList[Id].P[2] = V[V1];
  346.  
  347.             Mod->ActFace = Mod->ActFace + 1;
  348.     
  349.         }
  350.         //-----------*MESH_TVERT----------------
  351.         if (strcmp(cBuf,"*MESH_TVERT") == 0)
  352.         {
  353.             int Idf;
  354.             float Xs, Ys, Zs;
  355.  
  356.             fscanf(fp,"%d %f %f %f",&Idf,&Xs,&Ys,&Zs);
  357.  
  358.             T[Idf] = Get3D(Xs,-Ys,Zs);
  359.                     
  360.         }
  361.         //-----------*MESH_TFACE----------------
  362.         if (strcmp(cBuf,"*MESH_TFACE") == 0)
  363.         {
  364.             int Id = Mod->ActFace;
  365.         
  366.             int Idf; 
  367.             int V1,V2,V3;
  368.  
  369.             fscanf(fp,"%d %d %d %d",&Idf,&V1,&V2,&V3);
  370.     
  371.             Mod->FaceList[Id - NumF + Idf].T[0].X = T[V3].X;
  372.             Mod->FaceList[Id - NumF + Idf].T[0].Y = T[V3].Y;
  373.         
  374.             Mod->FaceList[Id - NumF + Idf].T[1].X = T[V2].X;
  375.             Mod->FaceList[Id - NumF + Idf].T[1].Y = T[V2].Y;
  376.             
  377.             Mod->FaceList[Id - NumF + Idf].T[2].X = T[V1].X;
  378.             Mod->FaceList[Id - NumF + Idf].T[2].Y = T[V1].Y;
  379.  
  380.         }
  381.  
  382.         //---------*MESH_FACENORMAL----------------
  383.         if (strcmp(cBuf,"*MESH_FACENORMAL") == 0)
  384.         {
  385.             
  386.             float X,Y,Z;
  387.             int Id ;
  388.             int VId;
  389.  
  390.             fscanf(fp,"%d",&Id);
  391.             Id = Mod->ActFace-NumF+Id;
  392.  
  393.             fscanf(fp,"%d %f %f %f",&VId,&X,&Z,&Y);
  394.             
  395.             //v0
  396.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  397.             Mod->FaceList[Id].N[2] = Get3D(X,Y,Z);
  398.             Mod->FaceList[Id].N[2] = TransformNormal(Mod->FaceList[Id].N[2], RotationMatrix);
  399.  
  400.             //v1
  401.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  402.             Mod->FaceList[Id].N[1] = Get3D(X,Y,Z);
  403.             Mod->FaceList[Id].N[1] = TransformNormal(Mod->FaceList[Id].N[1], RotationMatrix);
  404.  
  405.             //v2
  406.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  407.             Mod->FaceList[Id].N[0] = Get3D(X,Y,Z);
  408.             Mod->FaceList[Id].N[0] = TransformNormal(Mod->FaceList[Id].N[0], RotationMatrix);
  409.  
  410.             //plane
  411.             VECTOR3D N,V1,V2;
  412.             Sub(&V1,Mod->FaceList[Id].P[0],Mod->FaceList[Id].P[1]);
  413.             Sub(&V2,Mod->FaceList[Id].P[2],Mod->FaceList[Id].P[1]);
  414.             Cross(&N,V1,V2);
  415.             Normalize(&N);
  416.  
  417.             Mod->FaceList[Id].Plane.Normal = N;
  418.             Mod->FaceList[Id].Plane.D = -(N.X * Mod->FaceList[Id].P[1].X) 
  419.                                         -(N.Y * Mod->FaceList[Id].P[1].Y)
  420.                                         -(N.Z * Mod->FaceList[Id].P[1].Z);
  421.  
  422.     
  423.         }
  424.  
  425.         //-----------END GEOM OBJ--------------
  426.         if (strcmp(cBuf,"*PROP_MOTIONBLUR") == 0)
  427.         {
  428.             break;
  429.         }
  430.  
  431.         
  432.  
  433.  
  434.     }
  435.  
  436.     if (V != NULL)
  437.         delete [] V;
  438.  
  439.     if (T != NULL)
  440.         delete [] T;
  441.  
  442. }
  443.  
  444.  
  445. //------------------------------------------------------------------
  446. // Name: LoadTexture()
  447. // Desc: Loadne texturu
  448. //------------------------------------------------------------------
  449. void MODEL::LoadTexture(char *FileName,COLOR ColorKey)
  450. {
  451.  
  452.     char cBuf[80];
  453.  
  454.     sprintf(cBuf,"  Textura: %s",FileName);
  455.     LogPrint(cBuf);
  456.     
  457.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  458.                                   FileName,    
  459.                                   D3DX_DEFAULT, 
  460.                                   D3DX_DEFAULT, 
  461.                                   Engine.MipMapLevels,   //MipLevels
  462.                                   0,            
  463.                                   Engine.TextureFormat, 
  464.                                   D3DPOOL_DEFAULT,
  465.                                   D3DX_DEFAULT, //Filter
  466.                                   D3DX_DEFAULT, //MipFilter
  467.                                   D3DXCOLOR    (ColorKey.R,
  468.                                                 ColorKey.G,
  469.                                                 ColorKey.B,
  470.                                                 ColorKey.A),   //ColourKey
  471.                                   NULL,         
  472.                                   NULL,         
  473.                                   &g_pTexture)))  
  474.     {
  475.         sprintf(cBuf,"  chyba pri vytvarani textury: %s",FileName);
  476.         LogPrint(cBuf);
  477.     }
  478.     else
  479.     {
  480.         LogPrint("  Textura modelu vytvorena");
  481.     }    
  482.  
  483. }
  484.  
  485. //------------------------------------------------------------------
  486. // Name: LoadTexture()
  487. // Desc: Loadne texturu
  488. //------------------------------------------------------------------
  489. void MODEL::LoadEnviroMap(char *FileName)
  490. {
  491.  
  492.     char cBuf[80];
  493.  
  494.     sprintf(cBuf,"  Enviroment Textura: %s",FileName);
  495.     LogPrint(cBuf);
  496.     
  497.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  498.                                   FileName,    
  499.                                   D3DX_DEFAULT, 
  500.                                   D3DX_DEFAULT, 
  501.                                   Engine.MipMapLevels,   //MipLevels
  502.                                   0,            
  503.                                   Engine.TextureFormat, 
  504.                                   D3DPOOL_DEFAULT,
  505.                                   D3DX_DEFAULT, //Filter
  506.                                   D3DX_DEFAULT, //MipFilter
  507.                                   0,   //ColourKey
  508.                                   NULL,         
  509.                                   NULL,         
  510.                                   &g_pEnviroMap)))  
  511.     {
  512.         sprintf(cBuf,"  chyba pri vytvarani Enviroment Textury: %s",FileName);
  513.         LogPrint(cBuf);
  514.     }
  515.     else
  516.     {
  517.         LogPrint("  Enviroment Textura modelu vytvorena");
  518.     }    
  519.  
  520. }
  521.  
  522.  
  523. //------------------------------------------------------------------
  524. // Name: RenderModelNormal()
  525. // Desc: Ulozi model do Vertex pola + vyrenderuje normalne
  526. //------------------------------------------------------------------
  527. void MODEL::RenderModelNormal(MODELFRAME Mod)
  528. {
  529.     
  530.     //
  531.     //TEXTURED
  532.     //
  533.     if (Textured == true)
  534.     {
  535.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  536.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  537.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  538.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  539.     }
  540.     else
  541.     {
  542.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  543.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
  544.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  545.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  546.     }
  547.  
  548.     //nastav material
  549.     g_pd3dDevice->SetMaterial(&Material);
  550.  
  551.     //zapni vypni svetla
  552.     Engine.SetLighting(Lighting);
  553.  
  554.     //zapni specular ak je zapnuty
  555.     Engine.SetSpecular(Specular);
  556.  
  557.     //zapni dx back face culling
  558.     Engine.SetCullMode(D3DCULL_CCW);
  559.  
  560.     //renderuje z VB
  561.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  562.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  563.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  564.             
  565.     //reset to default
  566.     Engine.ResetToDefault();
  567.  
  568.     
  569. }
  570.  
  571. //------------------------------------------------------------------
  572. // Name: RenderModelOnlyShadow()
  573. // Desc: Ulozi model do Vertex pola + iba pre tien
  574. //------------------------------------------------------------------
  575. void MODEL::RenderModelOnlyShadow(MODELFRAME Mod)
  576. {
  577.     
  578.     int ActVertex = 0;
  579.  
  580.     //
  581.     //TEXTURED
  582.     //
  583.     if (Textured == true)
  584.     {
  585.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  586.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  587.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  588.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  589.     }
  590.     else
  591.     {
  592.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  593.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
  594.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  595.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  596.     }
  597.  
  598.     //reset to default
  599.     Engine.ResetToDefault();
  600.  
  601.     
  602. }
  603.  
  604. //------------------------------------------------------------------
  605. // Name: RenderModelEnvironment()
  606. // Desc: Ulozi model do Vertex pola + vyrenderuje cez enviro mapping
  607. //------------------------------------------------------------------
  608. void MODEL::RenderModelEnvironment(MODELFRAME Mod)
  609. {
  610.     
  611.     int ActVertex = 0;
  612.  
  613.     //pomocne
  614.     VECTOR3D P,N;
  615.     int u,i;
  616.     
  617.     //Vertex do ktoreho sa uklada
  618.     CUSTOMVERTEXMODEL *Vertex;
  619.  
  620.     //Otvor VB
  621.     g_pVB->Lock(0, 0, (void**)&Vertex, D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE ) ;
  622.  
  623.     //zobrazi model do pola vertexov
  624.     for (i = 0;i<NumFaces;i++)
  625.     {
  626.         for (u=0;u<3;u++)
  627.         {
  628.  
  629.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  630.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  631.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  632.  
  633.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  634.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  635.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  636.         
  637.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  638.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  639.         
  640.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  641.                                                 Color.G,
  642.                                                 Color.B,
  643.                                                 Color.A);
  644.  
  645.             //////////////////////
  646.             //ENVIROMENT MAPPING//
  647.             //////////////////////
  648.             P = TransformPoint(Mod.FaceList[i].P[u],Matica);
  649.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  650.  
  651.             Mod.FaceList[i].T[u] = EnvironmentMapping(P,N,400.0f,matView);
  652.         
  653.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  654.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  655.  
  656.         
  657.     
  658.             ActVertex = ActVertex + 1;                
  659.         }    
  660.  
  661.     }
  662.  
  663.  
  664.     //uzavri VB
  665.     g_pVB->Unlock() ;
  666.  
  667.     g_pd3dDevice->SetTexture( 0, g_pTexture );
  668.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  669.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  670.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  671.  
  672.     //nastav material
  673.     g_pd3dDevice->SetMaterial(&Material);
  674.  
  675.     //zapni vypni svetla
  676.     Engine.SetLighting(Lighting);
  677.  
  678.     //zapni specular ak je zapnuty
  679.     Engine.SetSpecular(Specular);
  680.  
  681.     //renderuje z VB
  682.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  683.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  684.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  685.             
  686.     //reset to default
  687.     Engine.ResetToDefault();
  688.  
  689.  
  690. }
  691.  
  692. //------------------------------------------------------------------
  693. // Name: RenderModelMultiTexture()
  694. // Desc: Ulozi model do Vertex pola + vyrenderuje cez enviro mapping
  695. //------------------------------------------------------------------
  696. void MODEL::RenderModelMultiTexture(MODELFRAME Mod)
  697. {
  698.     
  699.     int ActVertex = 0;
  700.  
  701.  
  702.  
  703.     g_pd3dDevice->SetTexture( 0,  g_pTexture );
  704.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
  705.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  706.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  707.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  708.  
  709.     g_pd3dDevice->SetTexture( 1,  g_pEnviroMap );
  710.     g_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
  711.     g_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS,  D3DTTFF_COUNT3);
  712.  
  713.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
  714.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  715.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
  716.  
  717.     //nastav material
  718.     g_pd3dDevice->SetMaterial(&Material);
  719.  
  720.     //zapni vypni svetla
  721.     Engine.SetLighting(Lighting);
  722.  
  723.     //zapni specular ak je zapnuty
  724.     Engine.SetSpecular(Specular);
  725.  
  726.     //renderuje z VB
  727.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  728.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  729.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  730.             
  731.     //reset to default
  732.     Engine.ResetToDefault();
  733.  
  734.  
  735. }
  736.  
  737. //------------------------------------------------------------------
  738. // Name: RenderModelBumpMap()
  739. // Desc: Ulozi model do Vertex pola + vyrenderuje cez bump mapping
  740. //------------------------------------------------------------------
  741. void MODEL::RenderModelBumpMap(MODELFRAME Mod)
  742. {
  743.     
  744.     int ActVertex = 0;
  745.  
  746.     //pomocne
  747. //    VECTOR3D N;
  748. //    VECTOR2D T;
  749.     int u,i;
  750.     
  751.     //Vertex do ktoreho sa uklada
  752.     CUSTOMVERTEXMODEL *Vertex;
  753.  
  754.     //Otvor VB
  755.     g_pVB->Lock(0, 0, (void**)&Vertex,D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE) ;
  756.  
  757.     //zobrazi model do pola vertexov
  758.     for (i = 0;i<NumFaces;i++)
  759.     {
  760.         for (u=0;u<3;u++)
  761.         {
  762.  
  763.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  764.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  765.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  766.  
  767.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  768.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  769.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  770.         
  771.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  772.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  773.         
  774.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  775.                                                 Color.G,
  776.                                                 Color.B,
  777.                                                 Color.A);
  778.  
  779.             /*
  780.             ////////////////
  781.             //BUMP MAPPING//
  782.             ////////////////
  783.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  784.  
  785.             T = BumpMapping(N,Mod.FaceList[i].T[u],0.05f,matView);
  786.     
  787.             //suradnice pre bump map
  788.             Vertex[ActVertex].tu2 = T.X;
  789.             Vertex[ActVertex].tv2 = T.Y;
  790.             */
  791.  
  792.             
  793.             
  794.             ActVertex = ActVertex + 1;                
  795.         }    
  796.  
  797.     }
  798.  
  799.  
  800.     //uzavri VB
  801.     g_pVB->Unlock() ;
  802.  
  803.     ////////////////
  804.     //BUMP MAPPING//
  805.     ////////////////
  806.     g_pd3dDevice->SetTexture( 0,  g_pTexture );
  807.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
  808.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  809.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  810.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  811.  
  812.     g_pd3dDevice->SetTexture( 1,  g_pTexture );
  813.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
  814.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
  815.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  816.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
  817.  
  818.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_ADDSIGNED );
  819.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT );
  820.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
  821.     
  822.     Engine.SetBlendCustom(D3DBLEND_SRCALPHA,D3DBLEND_ZERO);
  823.  
  824.  
  825.  
  826.     //nastav material
  827.     g_pd3dDevice->SetMaterial(&Material);
  828.  
  829.     //zapni vypni svetla
  830.     Engine.SetLighting(Lighting);
  831.  
  832.     //zapni specular ak je zapnuty
  833.     Engine.SetSpecular(Specular);
  834.  
  835.     //renderuje z VB
  836.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  837.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  838.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  839.             
  840.     //reset to default
  841.     Engine.ResetToDefault();
  842.  
  843.     //zresetuj blending
  844.     Engine.SetBlendNone();
  845.  
  846.  
  847. }
  848.  
  849.  
  850. //------------------------------------------------------------------
  851. // Name: Render()
  852. // Desc: Vyrenderuje 
  853. //------------------------------------------------------------------
  854. void MODEL::Render()
  855. {
  856.  
  857.     if (Frame >= NumFrames)
  858.             Frame = 0.0f;
  859.  
  860.     //vypocita maticu
  861.     Matica = GetMatrix(Pos,Rot,Sca);
  862.  
  863.     //ziska polomer a minmax
  864.     CalcMinMax(&ModelFrame,Matica);    
  865.     
  866.     //ak model vidno renderuj ho
  867.     if ((Camera.FrustrumSphere(ModelFrame.Centre,ModelFrame.Polomer) == true) ||
  868.         (FrustrumTest == false))
  869.     {
  870.         //nastavi maticu
  871.         g_pd3dDevice->SetTransform(D3DTS_WORLD, &Matica);
  872.  
  873.         //renderuj model
  874.         if (EnviromentMapping == true)
  875.             RenderModelEnvironment(ModelFrame);
  876.         if (MultiTexture == true && SpecularEffects == 1)
  877.             RenderModelMultiTexture(ModelFrame);
  878.         else if (BumpMap == true)
  879.             RenderModelBumpMap(ModelFrame);
  880.         else if (OnlyShadow == true)
  881.             RenderModelOnlyShadow(ModelFrame);
  882.         else
  883.             RenderModelNormal(ModelFrame);
  884.     }
  885. }
  886.  
  887. //------------------------------------------------------------------
  888. // Name: RenderFast()
  889. // Desc: Rychle vykreslenie
  890. //------------------------------------------------------------------
  891. void MODEL::RenderFast()
  892. {
  893. /*
  894.     if (Frame >= NumFrames)
  895.             Frame = 0.0f;
  896.  
  897.     //vypocita maticu
  898.     Matica = GetMatrix(Pos,Rot,Sca);
  899.  
  900.     //ziska polomer a minmax
  901.     CalcMinMax(&ModelFrame[(int)Frame],Matica);
  902.  
  903.     //ulozi min max do transformacneho modelu
  904.     ModelT.Min = ModelFrame[(int)Frame].Min;
  905.     ModelT.Max = ModelFrame[(int)Frame].Max;
  906.     ModelT.Centre = ModelFrame[(int)Frame].Centre;
  907.     ModelT.Polomer = ModelFrame[(int)Frame].Polomer;
  908.  
  909.     //ak model vidno renderuj ho
  910.     if ((Camera.FrustrumSphere(ModelT.Centre,ModelT.Polomer) == true) ||
  911.         (FrustrumTest == false))
  912.     {
  913.         //interpoluje model podla animacie
  914.         InterpolateModel(&ModelT);
  915.         
  916.         //nastavi maticu
  917.         g_pd3dDevice->SetTransform( D3DTS_WORLD, &Matica);
  918.  
  919.         //renderuj model
  920.         if (EnviromentMapping == true)
  921.             RenderModelEnvironment(ModelT);
  922.         else if (BumpMap == true)
  923.             RenderModelBumpMap(ModelT);
  924.         else
  925.             RenderModelNormal(ModelT);
  926.     }*/
  927. }
  928.  
  929. //------------------------------------------------------------------
  930. // Name: CalcFaceNormals()
  931. // Desc: Vypocita normaly
  932. //------------------------------------------------------------------
  933. void MODEL::CalcFaceNormals(MODELFRAME *Mod)
  934. {
  935.  
  936.     VECTOR3D V1;
  937.     VECTOR3D V2;
  938.     VECTOR3D N;
  939.     
  940.     for (int i=0;i<NumFaces;i++)
  941.     {
  942.         //normalovy vektor
  943.         Sub(&V1,Mod->FaceList[i].P[0],Mod->FaceList[i].P[1]);
  944.         Sub(&V2,Mod->FaceList[i].P[2],Mod->FaceList[i].P[1]);
  945.         Cross(&N,V1,V2);
  946.         Normalize(&N);
  947.  
  948.         //kazdy vertex
  949.         Mod->FaceList[i].N[0] = N;
  950.         Mod->FaceList[i].N[1] = N;
  951.         Mod->FaceList[i].N[2] = N;
  952.  
  953.         //vypocet plane trojholnika
  954.         Mod->FaceList[i].Plane.Normal = N;
  955.         Mod->FaceList[i].Plane.D = -(N.X * Mod->FaceList[i].P[1].X) 
  956.                                    -(N.Y * Mod->FaceList[i].P[1].Y)
  957.                                    -(N.Z * Mod->FaceList[i].P[1].Z);
  958.  
  959.     }
  960.     
  961. }
  962. //------------------------------------------------------------------
  963. // Name: CalcBoxPoints()
  964. // Desc: Vypocita body krabice
  965. //------------------------------------------------------------------
  966. void MODEL::CalcBoxPoints(MODELFRAME *Mod)
  967. {
  968.     VECTOR3D Min = {10000.0f,10000.0f,10000.0f};
  969.     VECTOR3D Max = {-10000.0f,-10000.0f,-10000.0f};
  970.  
  971.     for (int i=0;i<NumFaces;i++)
  972.     {
  973.     
  974.         //
  975.         //min max
  976.         //
  977.         for (int u=0;u<3;u++)
  978.         {
  979.             if (Mod->FaceList[i].P[u].X < Min.X)
  980.                 Min.X = Mod->FaceList[i].P[u].X;
  981.             if (Mod->FaceList[i].P[u].Y < Min.Y)
  982.                 Min.Y = Mod->FaceList[i].P[u].Y;
  983.             if (Mod->FaceList[i].P[u].Z < Min.Z)
  984.                 Min.Z = Mod->FaceList[i].P[u].Z;
  985.     
  986.             if (Mod->FaceList[i].P[u].X > Max.X)
  987.                 Max.X = Mod->FaceList[i].P[u].X;
  988.             if (Mod->FaceList[i].P[u].Y > Max.Y)
  989.                 Max.Y = Mod->FaceList[i].P[u].Y;
  990.             if (Mod->FaceList[i].P[u].Z > Max.Z)
  991.                 Max.Z = Mod->FaceList[i].P[u].Z;
  992.         }
  993.             
  994.     }
  995.  
  996.     //
  997.     //body
  998.     //
  999.  
  1000.     //spodna plocha
  1001.     Mod->P[0].X = Min.X;
  1002.     Mod->P[0].Y = Min.Y;
  1003.     Mod->P[0].Z = Min.Z;
  1004.  
  1005.     Mod->P[1].X = Max.X;
  1006.     Mod->P[1].Y = Min.Y;
  1007.     Mod->P[1].Z = Min.Z;
  1008.  
  1009.     Mod->P[2].X = Max.X;
  1010.     Mod->P[2].Y = Min.Y;
  1011.     Mod->P[2].Z = Max.Z;
  1012.  
  1013.     Mod->P[3].X = Min.X;
  1014.     Mod->P[3].Y = Min.Y;
  1015.     Mod->P[3].Z = Max.Z;
  1016.  
  1017.     //vrchna plocha
  1018.     Mod->P[4].X = Min.X;
  1019.     Mod->P[4].Y = Max.Y;
  1020.     Mod->P[4].Z = Min.Z;
  1021.  
  1022.     Mod->P[5].X = Max.X;
  1023.     Mod->P[5].Y = Max.Y;
  1024.     Mod->P[5].Z = Min.Z;
  1025.  
  1026.     Mod->P[6].X = Max.X;
  1027.     Mod->P[6].Y = Max.Y;
  1028.     Mod->P[6].Z = Max.Z;
  1029.  
  1030.     Mod->P[7].X = Min.X;
  1031.     Mod->P[7].Y = Max.Y;
  1032.     Mod->P[7].Z = Max.Z;
  1033. }
  1034.  
  1035.  
  1036. //------------------------------------------------------------------
  1037. // Name: CalcBoxPoints()
  1038. // Desc: Vypocita body krabice
  1039. //------------------------------------------------------------------
  1040. void MODEL::CalcMinMax(MODELFRAME *Mod,D3DXMATRIXA16 Matica)
  1041. {
  1042.     VECTOR3D Min = {10000.0f,10000.0f,10000.0f};
  1043.     VECTOR3D Max = {-10000.0f,-10000.0f,-10000.0f};
  1044.  
  1045.     VECTOR3D P[8];
  1046.  
  1047.     P[0] = TransformPoint(Mod->P[0],Matica);
  1048.     P[1] = TransformPoint(Mod->P[1],Matica);
  1049.     P[2] = TransformPoint(Mod->P[2],Matica);
  1050.     P[3] = TransformPoint(Mod->P[3],Matica);
  1051.     P[4] = TransformPoint(Mod->P[4],Matica);
  1052.     P[5] = TransformPoint(Mod->P[5],Matica);
  1053.     P[6] = TransformPoint(Mod->P[6],Matica);
  1054.     P[7] = TransformPoint(Mod->P[7],Matica);
  1055.  
  1056.     for (int i=0;i<8;i++)
  1057.     {
  1058.         //
  1059.         //min max
  1060.         //
  1061.     
  1062.         if (P[i].X < Min.X)
  1063.             Min.X = P[i].X;
  1064.         if (P[i].Y < Min.Y)
  1065.             Min.Y = P[i].Y;
  1066.         if (P[i].Z < Min.Z)
  1067.             Min.Z = P[i].Z;
  1068.     
  1069.         if (P[i].X > Max.X)
  1070.             Max.X = P[i].X;
  1071.         if (P[i].Y > Max.Y)
  1072.             Max.Y = P[i].Y;
  1073.         if (P[i].Z > Max.Z)
  1074.             Max.Z = P[i].Z;
  1075.  
  1076.             
  1077.     }
  1078.  
  1079.     //
  1080.     //uloz hodnoty
  1081.     //
  1082.  
  1083.     Mod->Centre.X = (Max.X + Min.X)/2.0f;
  1084.     Mod->Centre.Y = (Max.Y + Min.Y)/2.0f;
  1085.     Mod->Centre.Z = (Max.Z + Min.Z)/2.0f;
  1086.  
  1087.     Mod->Min = Min;
  1088.     Mod->Max = Max;
  1089.  
  1090.     Mod->Polomer = CalcDistance(Min,Mod->Centre);
  1091.     
  1092.     
  1093. }
  1094.  
  1095.  
  1096. //------------------------------------------------------------------
  1097. // Name: TransformModel()
  1098. // Desc: 
  1099. //------------------------------------------------------------------
  1100. void MODEL::TransformModel(MODELFRAME *Mod,D3DXMATRIXA16 Matica)
  1101. {
  1102.  
  1103.  
  1104.     for (int i=0;i<NumFaces;i++)
  1105.     {
  1106.         Mod->FaceList[i].P[0] = TransformPoint(Mod->FaceList[i].P[0],Matica);    
  1107.         Mod->FaceList[i].P[1] = TransformPoint(Mod->FaceList[i].P[1],Matica);    
  1108.         Mod->FaceList[i].P[2] = TransformPoint(Mod->FaceList[i].P[2],Matica);    
  1109.  
  1110.         Mod->FaceList[i].N[0] = TransformNormal(Mod->FaceList[i].N[0],Matica);    
  1111.         Mod->FaceList[i].N[1] = TransformNormal(Mod->FaceList[i].N[1],Matica);    
  1112.         Mod->FaceList[i].N[2] = TransformNormal(Mod->FaceList[i].N[2],Matica);
  1113.         
  1114.         Mod->FaceList[i].Plane = TransformPlane(Mod->FaceList[i].Plane,Matica);
  1115.     
  1116.         Mod->ZeroPoint = TransformPoint(Mod->ZeroPoint,Matica);
  1117.     }
  1118. }
  1119.  
  1120.  
  1121.  
  1122. //------------------------------------------------------------------
  1123. // Name: InterpolateModel()
  1124. // Desc: interpoluje model a posle ho do ModelT
  1125. //------------------------------------------------------------------
  1126. void MODEL::InterpolateModel(MODELFRAME *Mod)
  1127. {
  1128. /*    
  1129.     //dolny horny snimok
  1130.     int F1 = (int)Frame;
  1131.     int F2 = ((int)Frame) + 1;
  1132.  
  1133.     if (F2 == NumFrames)
  1134.         F2 = 0;
  1135.  
  1136.     //Interpolant
  1137.     float Int = Frame - ((float)F1);
  1138.  
  1139.     //netreba zbytocne interpolovat ak je interpolant rovny nule
  1140.     if (Int != 0.0f)
  1141.     {
  1142.     
  1143.         for (int i=0;i<NumFaces;i++)
  1144.         {
  1145.  
  1146.             for (int u=0;u<3;u++)
  1147.             {
  1148.                 Mod->FaceList[i].P[u].X = ModelFrame[F1].FaceList[i].P[u].X + (Int *(ModelFrame[F2].FaceList[i].P[u].X - ModelFrame[F1].FaceList[i].P[u].X));    
  1149.                 Mod->FaceList[i].P[u].Y = ModelFrame[F1].FaceList[i].P[u].Y + (Int *(ModelFrame[F2].FaceList[i].P[u].Y - ModelFrame[F1].FaceList[i].P[u].Y));    
  1150.                 Mod->FaceList[i].P[u].Z = ModelFrame[F1].FaceList[i].P[u].Z + (Int *(ModelFrame[F2].FaceList[i].P[u].Z - ModelFrame[F1].FaceList[i].P[u].Z));    
  1151.  
  1152.                 Mod->FaceList[i].N[u].X = ModelFrame[F1].FaceList[i].N[u].X + (Int *(ModelFrame[F2].FaceList[i].N[u].X - ModelFrame[F1].FaceList[i].N[u].X));    
  1153.                 Mod->FaceList[i].N[u].Y = ModelFrame[F1].FaceList[i].N[u].Y + (Int *(ModelFrame[F2].FaceList[i].N[u].Y - ModelFrame[F1].FaceList[i].N[u].Y));    
  1154.                 Mod->FaceList[i].N[u].Z = ModelFrame[F1].FaceList[i].N[u].Z + (Int *(ModelFrame[F2].FaceList[i].N[u].Z - ModelFrame[F1].FaceList[i].N[u].Z));    
  1155.     
  1156.                 Mod->FaceList[i].T[u].X = ModelFrame[F1].FaceList[i].T[u].X;    
  1157.                 Mod->FaceList[i].T[u].Y = ModelFrame[F1].FaceList[i].T[u].Y;    
  1158.     
  1159.             }
  1160.  
  1161.             Mod->FaceList[i].Plane.Normal.X = ModelFrame[F1].FaceList[i].Plane.Normal.X + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.X - ModelFrame[F1].FaceList[i].Plane.Normal.X));    
  1162.             Mod->FaceList[i].Plane.Normal.Y = ModelFrame[F1].FaceList[i].Plane.Normal.Y + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.Y - ModelFrame[F1].FaceList[i].Plane.Normal.Y));    
  1163.             Mod->FaceList[i].Plane.Normal.Z = ModelFrame[F1].FaceList[i].Plane.Normal.Z + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.Z - ModelFrame[F1].FaceList[i].Plane.Normal.Z));    
  1164.             Mod->FaceList[i].Plane.D = ModelFrame[F1].FaceList[i].Plane.D + (Int *(ModelFrame[F2].FaceList[i].Plane.D - ModelFrame[F1].FaceList[i].Plane.D));    
  1165.     
  1166.  
  1167.             for (u=0;u<8;u++)
  1168.             {
  1169.                 Mod->P[u] = ModelFrame[F1].P[u];
  1170.             }
  1171.         }
  1172.     
  1173.     }
  1174.  
  1175.     else  ////////
  1176.  
  1177.     {
  1178.         for (int i=0;i<NumFaces;i++)
  1179.         {
  1180.             for (int u=0;u<3;u++)
  1181.             {
  1182.                 Mod->FaceList[i].P[u] = ModelFrame[F1].FaceList[i].P[u] ;    
  1183.                 Mod->FaceList[i].N[u] = ModelFrame[F1].FaceList[i].N[u] ;    
  1184.                 Mod->FaceList[i].Plane = ModelFrame[F1].FaceList[i].Plane;    
  1185.                 Mod->FaceList[i].T[u] = ModelFrame[F1].FaceList[i].T[u];    
  1186.                 Mod->FaceList[i].T[u] = ModelFrame[F1].FaceList[i].T[u];    
  1187.     
  1188.             }
  1189.  
  1190.             for (u=0;u<8;u++)
  1191.             {
  1192.                 Mod->P[u] = ModelFrame[F1].P[u];
  1193.             }
  1194.         }
  1195.     
  1196.     }*/
  1197. }
  1198.  
  1199. //------------------------------------------------------------------
  1200. // Name: Smooth Shading
  1201. // Desc: vypocita smooth shading
  1202. //------------------------------------------------------------------
  1203. void MODEL::CalcSmoothShading(MODELFRAME *Mod)
  1204. {
  1205.  
  1206.     VECTOR3D *Normal = NULL;
  1207.     Normal = new VECTOR3D[NumFaces];
  1208.     
  1209.     for (int i=0;i<NumFaces;i=i+1)
  1210.     {
  1211.     for (int u=0;u<3;u=u+1)
  1212.     {
  1213.  
  1214.         //bod
  1215.         VECTOR3D B = Mod->FaceList[i].P[u];
  1216.         
  1217.         VECTOR3D NormalVys = Get3D(0.0f,0.0f,0.0f);
  1218.         int ActNormal = 0;
  1219.  
  1220.         //ziskaj normaly
  1221.         for (int j=0;j<NumFaces;j=j+1)
  1222.         {
  1223.         for (int k=0;k<3;k=k+1)
  1224.         {
  1225.             
  1226.  
  1227.             if((B.X == Mod->FaceList[j].P[k].X)  &&
  1228.                (B.Y == Mod->FaceList[j].P[k].Y)  &&
  1229.                (B.Z == Mod->FaceList[j].P[k].Z) )
  1230.             {
  1231.         
  1232.                 Normal[ActNormal] = Mod->FaceList[j].Plane.Normal ;
  1233.                 ActNormal++;
  1234.                             
  1235.             }
  1236.  
  1237.         }
  1238.         }
  1239.  
  1240.         //vypocitaj normalu
  1241.         for (int a=0;a<ActNormal;a++)
  1242.         {
  1243.             Add(&NormalVys,NormalVys,Normal[a]);
  1244.         }
  1245.         
  1246.         //normalizuj vyslednu normalu
  1247.         Normalize(&NormalVys);
  1248.  
  1249.         //zapis nove normaly
  1250.         for (j=0;j<NumFaces;j++)
  1251.         {
  1252.         for (int k=0;k<3;k++)
  1253.         {
  1254.  
  1255.             if((B.X == Mod->FaceList[j].P[k].X)  &&
  1256.                (B.Y == Mod->FaceList[j].P[k].Y)  &&
  1257.                (B.Z == Mod->FaceList[j].P[k].Z) )
  1258.             {
  1259.                 Mod->FaceList[j].N[k] = NormalVys;
  1260.             }
  1261.  
  1262.         }
  1263.         }
  1264.  
  1265.  
  1266.     }
  1267.     }
  1268.  
  1269.     if (Normal != NULL)
  1270.         delete [] Normal;
  1271.     Normal = NULL;
  1272.  
  1273.  
  1274.  
  1275. }
  1276.  
  1277.  
  1278. //------------------------------------------------------------------
  1279. // Name: SetMaterial()
  1280. // Desc: nastavy material
  1281. //------------------------------------------------------------------
  1282. void MODEL::SetMaterial(D3DMATERIAL9 Mat)
  1283. {
  1284.     Material = Mat;
  1285. }
  1286.  
  1287.  
  1288. //------------------------------------------------------------------
  1289. // Name: CollisionBox()
  1290. // Desc: Bouring box kolizia
  1291. //------------------------------------------------------------------
  1292. bool MODEL::CollisionBox(VECTOR3D P1, VECTOR3D P2,D3DXMATRIX PomMatrix)
  1293. {
  1294.  
  1295.     //transformuj body
  1296.     P1 = UnTransformPoint(P1,PomMatrix);
  1297.     P2 = UnTransformPoint(P2,PomMatrix);
  1298.  
  1299.     if (CollisionBoxEdge(P1,P2,ModelFrame.P[0],ModelFrame.P[6]))
  1300.         return true;
  1301.     else
  1302.         return false;
  1303.  
  1304. }
  1305.  
  1306.  
  1307. //------------------------------------------------------------------
  1308. // Name: CollisionDetail()
  1309. // Desc: detailna kolizia
  1310. //------------------------------------------------------------------
  1311. bool MODEL::CollisionDetail(VECTOR3D P1,VECTOR3D P2,D3DXMATRIX PomMatrix)
  1312. {
  1313.  
  1314.     //iba ak collision BOX == true
  1315.     if (CollisionBox(P1,P2,PomMatrix) == false)
  1316.         return false;
  1317.     else
  1318.     {
  1319.  
  1320.  
  1321.     //uhly
  1322.     float U,U1,U2,U3;
  1323.  
  1324.     //
  1325.     //testuj pre vsetky face
  1326.     //
  1327.  
  1328.  
  1329.     //transformuj body
  1330.     P1 = UnTransformPoint(P1,PomMatrix);
  1331.     P2 = UnTransformPoint(P2,PomMatrix);
  1332.  
  1333.     VECTOR3D Inter; //priesecnik
  1334.  
  1335.     for (int i=0;i<NumFaces;i++)
  1336.     {
  1337.  
  1338.         if (CalcPriesEdge(&Inter,ModelFrame.FaceList[i].Plane,P1,P2) == true)
  1339.         {
  1340.             
  1341.             U1 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[0],
  1342.                                        ModelFrame.FaceList[i].P[1]);
  1343.             U2 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[1],
  1344.                                        ModelFrame.FaceList[i].P[2]);
  1345.             U3 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[2],
  1346.                                        ModelFrame.FaceList[i].P[0]);
  1347.  
  1348.             U = U1+U2+U3;
  1349.  
  1350.             if (U > 6.2f && U < 6.35f)
  1351.             {
  1352.                 ColPosition = TransformPoint(Inter,PomMatrix);
  1353.                 ColNormal = TransformNormal(ModelFrame.FaceList[i].Plane.Normal,PomMatrix);
  1354.             
  1355.                 return true;
  1356.             }
  1357.         }
  1358.     }
  1359.  
  1360.     return false;
  1361.  
  1362.     }
  1363.  
  1364. }
  1365.  
  1366. //------------------------------------------------------------------
  1367. // Name: LoadMD2
  1368. // Desc: Nacita MD2 model
  1369. //------------------------------------------------------------------
  1370. void MODEL::LoadMD2(char *FileName,int NFrames)
  1371. {
  1372.  
  1373. /*    //info pre Log
  1374.     char cBuf[80];
  1375.     LogPrint("Inicializujem MD2 model");
  1376.     sprintf(cBuf,"  Subor: %s",FileName);
  1377.     
  1378.  
  1379.     FILE *File = NULL;  //subor z ktoreho sa bude citat
  1380.  
  1381.     tMd2Header m_Header;
  1382.  
  1383.     ////////////////
  1384.     //otvori subor//
  1385.     ////////////////
  1386.     File = fopen(FileName, "rb");
  1387.     if (File == NULL)
  1388.         LogPrint("  Subor sa nenasiel");
  1389.  
  1390.  
  1391.     ////////////////////
  1392.     //nacitaj hlavicku//
  1393.     ////////////////////
  1394.     fread(&m_Header, 1, sizeof(tMd2Header), File);
  1395.     
  1396.     NumFaces = m_Header.numTriangles;
  1397.     NumFrames = NFrames;
  1398.  
  1399.     //info pre log
  1400.     sprintf(cBuf,"  Pocet snimkov: %d",m_Header.numFrames);
  1401.     LogPrint(cBuf);
  1402.     sprintf(cBuf,"  Pocet vertex: %d",m_Header.numVertices);
  1403.     LogPrint(cBuf);
  1404.     sprintf(cBuf,"  Pocet trojholnikov: %d",m_Header.numTriangles);
  1405.     LogPrint(cBuf);
  1406.  
  1407.  
  1408.     /////////////////////////
  1409.     //inicializacia modelov//
  1410.     /////////////////////////
  1411.  
  1412.     //vytvori zasobnik modelov
  1413.     ModelFrame = new MODELFRAME [NumFrames];
  1414.  
  1415.     //inicializuje zasobnik modelov
  1416.     for (int i=0;i<NumFrames;i++)
  1417.     {
  1418.         InitializeModel(&ModelFrame[i],NumFaces);
  1419.     }
  1420.  
  1421.     //inicializuje transformovany model
  1422.     InitializeModel(&ModelT,NumFaces);
  1423.  
  1424.     ////////////////////////////
  1425.     //vytvaranie vertex buffer//
  1426.     ////////////////////////////
  1427.  
  1428.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  1429.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  1430.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  1431.       {
  1432.         LogPrint("  Chyba pri vytvarani VB");
  1433.     }
  1434.     else
  1435.     {
  1436.         LogPrint("  Vertex Buffer vytvoreny");
  1437.     }
  1438.  
  1439.     ///////////////////////////////////
  1440.     //veci potrebne pre nacitanie MD2//
  1441.     ///////////////////////////////////
  1442.     unsigned char buffer[MD2_MAX_FRAMESIZE];
  1443.  
  1444.     tMd2Skin *m_pSkins         = new tMd2Skin [m_Header.numSkins];
  1445.     tMd2TexCoord *m_pTexCoords = new tMd2TexCoord [m_Header.numTexCoords];
  1446.     tMd2Face *m_pTriangles     = new tMd2Face [m_Header.numTriangles];
  1447.     tMd2Frame *m_pFrames       = new tMd2Frame [m_Header.numFrames];
  1448.  
  1449.  
  1450.     //////////////////////
  1451.     //Nacitavanie udajov//
  1452.     //////////////////////
  1453.     
  1454.     fseek(File, m_Header.offsetSkins, SEEK_SET);
  1455.     fread(m_pSkins, sizeof(tMd2Skin), m_Header.numSkins, File);
  1456.     
  1457.     fseek(File, m_Header.offsetTexCoords, SEEK_SET);
  1458.     fread(m_pTexCoords, sizeof(tMd2TexCoord), m_Header.numTexCoords, File);
  1459.  
  1460.     fseek(File, m_Header.offsetTriangles, SEEK_SET);
  1461.     fread(m_pTriangles, sizeof(tMd2Face), m_Header.numTriangles, File);
  1462.             
  1463.     fseek(File, m_Header.offsetFrames, SEEK_SET);
  1464.  
  1465.     for (i=0; i < m_Header.numFrames; i++)
  1466.     {
  1467.         // Assign our alias frame to our buffer memory
  1468.         tMd2AliasFrame *pFrame = (tMd2AliasFrame *) buffer;
  1469.  
  1470.         // Allocate the memory for the first frame of animation's vertices
  1471.         m_pFrames[i].pVertices = new tMd2Triangle [m_Header.numVertices];
  1472.  
  1473.         // Read in the first frame of animation
  1474.         fread(pFrame, 1, m_Header.frameSize, File);
  1475.  
  1476.         // Store off a vertex array pointer to cut down large lines of code
  1477.         tMd2Triangle *pVertices = m_pFrames[i].pVertices;
  1478.         
  1479.         // Go through all of the number of vertices and assign the scale and translations.
  1480.         // Store the vertices in our current frame's vertex list array, while swapping Y and Z.
  1481.         // Notice we also negate the Z axis as well to make the swap correctly.
  1482.         for (int j=0; j < m_Header.numVertices; j++)
  1483.         {
  1484.             pVertices[j].vertex[0] = pFrame->aliasVertices[j].vertex[0] * pFrame->scale[0] + pFrame->translate[0];
  1485.             pVertices[j].vertex[2] = -1 * (pFrame->aliasVertices[j].vertex[1] * pFrame->scale[1] + pFrame->translate[1]);
  1486.             pVertices[j].vertex[1] = pFrame->aliasVertices[j].vertex[2] * pFrame->scale[2] + pFrame->translate[2];
  1487.         }
  1488.     }
  1489.  
  1490.  
  1491.     fclose(File);
  1492.  
  1493.     /////////////////
  1494.     //Konvertovanie// 
  1495.     /////////////////
  1496.     //opakuj pre kazdy frame
  1497.     for (i=0;i<NFrames;i++)
  1498.     {
  1499.  
  1500.         //pre vsetky trojholniky vo frame
  1501.         for (int u=0;u<m_Header.numTriangles;u++)
  1502.         {
  1503.             int V1,V2,V3; //index vertexov
  1504.             int T1,T2,T3; //index texturovych kordinatov
  1505.  
  1506.  
  1507.             V1 = m_pTriangles[u].vertexIndices[0];
  1508.             V2 = m_pTriangles[u].vertexIndices[1];
  1509.             V3 = m_pTriangles[u].vertexIndices[2];
  1510.  
  1511.             T1 = m_pTriangles[u].textureIndices[0];
  1512.             T2 = m_pTriangles[u].textureIndices[1];
  1513.             T3 = m_pTriangles[u].textureIndices[2];
  1514.  
  1515.             ModelFrame[i].FaceList[u].P[2].X =     m_pFrames[i].pVertices[V1].vertex[0];        
  1516.             ModelFrame[i].FaceList[u].P[2].Y =     m_pFrames[i].pVertices[V1].vertex[1];    
  1517.             ModelFrame[i].FaceList[u].P[2].Z =     m_pFrames[i].pVertices[V1].vertex[2];
  1518.             ModelFrame[i].FaceList[u].T[2].X =     m_pTexCoords[T1].u/float(m_Header.skinWidth) ;        
  1519.             ModelFrame[i].FaceList[u].T[2].Y =     m_pTexCoords[T1].v/float(m_Header.skinHeight);
  1520.  
  1521.             ModelFrame[i].FaceList[u].P[1].X =     m_pFrames[i].pVertices[V2].vertex[0];        
  1522.             ModelFrame[i].FaceList[u].P[1].Y =     m_pFrames[i].pVertices[V2].vertex[1];    
  1523.             ModelFrame[i].FaceList[u].P[1].Z =     m_pFrames[i].pVertices[V2].vertex[2];
  1524.             ModelFrame[i].FaceList[u].T[1].X =     m_pTexCoords[T2].u/float(m_Header.skinWidth);        
  1525.             ModelFrame[i].FaceList[u].T[1].Y =     m_pTexCoords[T2].v/float(m_Header.skinHeight);
  1526.  
  1527.             ModelFrame[i].FaceList[u].P[0].X =     m_pFrames[i].pVertices[V3].vertex[0];        
  1528.             ModelFrame[i].FaceList[u].P[0].Y =     m_pFrames[i].pVertices[V3].vertex[1];    
  1529.             ModelFrame[i].FaceList[u].P[0].Z =     m_pFrames[i].pVertices[V3].vertex[2];
  1530.             ModelFrame[i].FaceList[u].T[0].X =     m_pTexCoords[T3].u/float(m_Header.skinWidth);        
  1531.             ModelFrame[i].FaceList[u].T[0].Y =     m_pTexCoords[T3].v/float(m_Header.skinHeight);
  1532.  
  1533.         }
  1534.  
  1535.         //vypocitajminmax
  1536.         CalcBoxPoints(&ModelFrame[i]);
  1537.  
  1538.         //vypocitaj normaly
  1539.         if (Normals == true)
  1540.             CalcFaceNormals(&ModelFrame[i]);
  1541.  
  1542.         //vypocitaj smooth shading
  1543.         if (SmoothShading == true)
  1544.             CalcSmoothShading(&ModelFrame[i]);
  1545.  
  1546.     }*/
  1547.  
  1548.                             
  1549.  
  1550. }
  1551.  
  1552. //------------------------------------------------------------------
  1553. // Name: SaveSHD
  1554. // Desc: Ulozi model ako SHD
  1555. //------------------------------------------------------------------
  1556. void MODEL::SaveSHD(char *FileName)
  1557. {
  1558.  
  1559. /*    //struktury pre zapis
  1560.     Shd_Header Header;
  1561.     Shd_Face Face;
  1562.  
  1563.     //subor
  1564.     FILE *File;
  1565.     File = fopen(FileName,"wb");
  1566.  
  1567.     //nastavy header
  1568.     Header.NumFaces = NumFaces;
  1569.     Header.NumFrames = NumFrames;
  1570.     Header.Version = 1;
  1571.  
  1572.     //zapis header
  1573.     fwrite(&Header,sizeof(Header),1,File);
  1574.  
  1575.     //zapise pole
  1576.     for (int i=0;i<NumFrames;i++)
  1577.     {
  1578.         for (int u=0;u<NumFaces;u++)
  1579.         {
  1580.  
  1581.             Face.Vertex[0].P[0] = ModelFrame[i].FaceList[u].P[0].X;
  1582.             Face.Vertex[0].P[1] = ModelFrame[i].FaceList[u].P[0].Y;
  1583.             Face.Vertex[0].P[2] = ModelFrame[i].FaceList[u].P[0].Z;
  1584.             Face.Vertex[0].N[0] = ModelFrame[i].FaceList[u].N[0].X;
  1585.             Face.Vertex[0].N[1] = ModelFrame[i].FaceList[u].N[0].Y;
  1586.             Face.Vertex[0].N[2] = ModelFrame[i].FaceList[u].N[0].Z;
  1587.             Face.Vertex[0].T[0] = ModelFrame[i].FaceList[u].T[0].X;
  1588.             Face.Vertex[0].T[1] = ModelFrame[i].FaceList[u].T[0].Y;
  1589.  
  1590.             Face.Vertex[1].P[0] = ModelFrame[i].FaceList[u].P[1].X;
  1591.             Face.Vertex[1].P[1] = ModelFrame[i].FaceList[u].P[1].Y;
  1592.             Face.Vertex[1].P[2] = ModelFrame[i].FaceList[u].P[1].Z;
  1593.             Face.Vertex[1].N[0] = ModelFrame[i].FaceList[u].N[1].X;
  1594.             Face.Vertex[1].N[1] = ModelFrame[i].FaceList[u].N[1].Y;
  1595.             Face.Vertex[1].N[2] = ModelFrame[i].FaceList[u].N[1].Z;
  1596.             Face.Vertex[1].T[0] = ModelFrame[i].FaceList[u].T[1].X;
  1597.             Face.Vertex[1].T[1] = ModelFrame[i].FaceList[u].T[1].Y;
  1598.  
  1599.             Face.Vertex[2].P[0] = ModelFrame[i].FaceList[u].P[2].X;
  1600.             Face.Vertex[2].P[1] = ModelFrame[i].FaceList[u].P[2].Y;
  1601.             Face.Vertex[2].P[2] = ModelFrame[i].FaceList[u].P[2].Z;
  1602.             Face.Vertex[2].N[0] = ModelFrame[i].FaceList[u].N[2].X;
  1603.             Face.Vertex[2].N[1] = ModelFrame[i].FaceList[u].N[2].Y;
  1604.             Face.Vertex[2].N[2] = ModelFrame[i].FaceList[u].N[2].Z;
  1605.             Face.Vertex[2].T[0] = ModelFrame[i].FaceList[u].T[2].X;
  1606.             Face.Vertex[2].T[1] = ModelFrame[i].FaceList[u].T[2].Y;
  1607.     
  1608.             Face.Normal[0] = ModelFrame[i].FaceList[u].Plane.Normal.X;
  1609.             Face.Normal[1] = ModelFrame[i].FaceList[u].Plane.Normal.Y;
  1610.             Face.Normal[2] = ModelFrame[i].FaceList[u].Plane.Normal.Z;
  1611.             Face.D         = ModelFrame[i].FaceList[u].Plane.D;
  1612.  
  1613.             fwrite(&Face,sizeof(Face),1,File);
  1614.  
  1615.         }
  1616.     }
  1617.  
  1618.  
  1619.     //zavri subor
  1620.     fclose(File);*/
  1621.  
  1622. }
  1623.  
  1624. //------------------------------------------------------------------
  1625. // Name: LoadSHD
  1626. // Desc: Loadne SHD model
  1627. //------------------------------------------------------------------
  1628. void MODEL::LoadSHD(char *FileName)
  1629. {
  1630. /*
  1631.     //log
  1632.     char cBuf[80];
  1633.     LogPrint("Inicializujem SHD subor");
  1634.     sprintf(cBuf,"  Subor: %s",FileName);
  1635.     LogPrint(cBuf);
  1636.  
  1637.     //struktury pre citanie
  1638.     Shd_Header Header;
  1639.     Shd_Face Face;
  1640.  
  1641.     /////////
  1642.     //subor//
  1643.     /////////
  1644.     FILE *File = NULL;
  1645.     File = fopen(FileName,"rb");
  1646.     if (File == NULL)
  1647.         LogPrint("  Subor sa nenasiel");
  1648.  
  1649.     ////////////////////
  1650.     //precita hlavicku//
  1651.     ////////////////////
  1652.     fread(&Header,sizeof(Header),1,File);
  1653.  
  1654.     ////////////////////
  1655.     //nastavy premenne//
  1656.     ////////////////////
  1657.     NumFaces = Header.NumFaces;
  1658.     NumFrames = Header.NumFrames;
  1659.  
  1660.     sprintf(cBuf,"  Pocet trojholnikov: %d",NumFaces);
  1661.     LogPrint(cBuf);
  1662.  
  1663.     sprintf(cBuf,"  Pocet snimkov: %d",NumFrames);
  1664.     LogPrint(cBuf);
  1665.  
  1666.     /////////////////////////
  1667.     //inicializacia modelov//
  1668.     /////////////////////////
  1669.  
  1670.     //vytvori zasobnik modelov
  1671.     ModelFrame = new MODELFRAME [NumFrames];
  1672.  
  1673.     //inicializuje zasobnik modelov
  1674.     for (int i=0;i<NumFrames;i++)
  1675.     {
  1676.         InitializeModel(&ModelFrame[i],NumFaces);
  1677.     }
  1678.  
  1679.     //inicializuje transformovany model
  1680.     InitializeModel(&ModelT,NumFaces);
  1681.  
  1682.     ////////////////////////////
  1683.     //vytvaranie vertex buffer//
  1684.     ////////////////////////////
  1685.  
  1686.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  1687.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  1688.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  1689.       {
  1690.         LogPrint("  Chyba pri vytvarani VB");
  1691.     }
  1692.     else
  1693.     {
  1694.         LogPrint("  Vertex Buffer vytvoreny");
  1695.     }
  1696.  
  1697.     /////////////////
  1698.     //Konvertovanie// 
  1699.     /////////////////
  1700.     for (i=0;i<NumFrames;i++)
  1701.     {
  1702.         for (int u=0;u<NumFaces;u++)
  1703.         {
  1704.             fread(&Face,sizeof(Face),1,File);
  1705.  
  1706.             ModelFrame[i].FaceList[u].P[0].X = Face.Vertex[0].P[0];
  1707.             ModelFrame[i].FaceList[u].P[0].Y = Face.Vertex[0].P[1];
  1708.             ModelFrame[i].FaceList[u].P[0].Z = Face.Vertex[0].P[2];
  1709.             ModelFrame[i].FaceList[u].N[0].X = Face.Vertex[0].N[0];
  1710.             ModelFrame[i].FaceList[u].N[0].Y = Face.Vertex[0].N[1];
  1711.             ModelFrame[i].FaceList[u].N[0].Z = Face.Vertex[0].N[2];
  1712.             ModelFrame[i].FaceList[u].T[0].X = Face.Vertex[0].T[0] ;
  1713.             ModelFrame[i].FaceList[u].T[0].Y = Face.Vertex[0].T[1];
  1714.  
  1715.             ModelFrame[i].FaceList[u].P[1].X = Face.Vertex[1].P[0];
  1716.             ModelFrame[i].FaceList[u].P[1].Y = Face.Vertex[1].P[1];
  1717.             ModelFrame[i].FaceList[u].P[1].Z = Face.Vertex[1].P[2];
  1718.             ModelFrame[i].FaceList[u].N[1].X = Face.Vertex[1].N[0];
  1719.             ModelFrame[i].FaceList[u].N[1].Y = Face.Vertex[1].N[1];
  1720.             ModelFrame[i].FaceList[u].N[1].Z = Face.Vertex[1].N[2] ;
  1721.             ModelFrame[i].FaceList[u].T[1].X = Face.Vertex[1].T[0];
  1722.             ModelFrame[i].FaceList[u].T[1].Y = Face.Vertex[1].T[1];
  1723.  
  1724.             ModelFrame[i].FaceList[u].P[2].X = Face.Vertex[2].P[0];
  1725.             ModelFrame[i].FaceList[u].P[2].Y = Face.Vertex[2].P[1];
  1726.             ModelFrame[i].FaceList[u].P[2].Z = Face.Vertex[2].P[2];
  1727.             ModelFrame[i].FaceList[u].N[2].X = Face.Vertex[2].N[0];
  1728.             ModelFrame[i].FaceList[u].N[2].Y = Face.Vertex[2].N[1];
  1729.             ModelFrame[i].FaceList[u].N[2].Z = Face.Vertex[2].N[2];
  1730.             ModelFrame[i].FaceList[u].T[2].X = Face.Vertex[2].T[0];
  1731.             ModelFrame[i].FaceList[u].T[2].Y = Face.Vertex[2].T[1];
  1732.     
  1733.             ModelFrame[i].FaceList[u].Plane.Normal.X = Face.Normal[0];
  1734.             ModelFrame[i].FaceList[u].Plane.Normal.Y = Face.Normal[1];
  1735.             ModelFrame[i].FaceList[u].Plane.Normal.Z = Face.Normal[2];
  1736.             ModelFrame[i].FaceList[u].Plane.D = Face.D;
  1737.         
  1738.  
  1739.         }
  1740.  
  1741.         //vypocitaj min max pre kazdy snimok
  1742.         CalcBoxPoints(&ModelFrame[i]);
  1743.     }
  1744.     
  1745.  
  1746.     //zavri subor
  1747.     fclose(File);*/
  1748.  
  1749. }
  1750.  
  1751. //------------------------------------------------------------------
  1752. // Name: BuildShadow()
  1753. // Desc: urobi tien do stencil class
  1754. //------------------------------------------------------------------
  1755. void MODEL::BuildShadow(STENCIL *Stn)
  1756. {
  1757.  
  1758.     //nastavi maticu
  1759.     g_pd3dDevice->SetTransform( D3DTS_WORLD, &Matica);
  1760.  
  1761.     //transformuje svetlo do priestoru modelu
  1762.     VECTOR3D LightPos = UnTransformPoint(Stn->LightPosition,Matica);
  1763.         
  1764.     for (int i=0;i<ModelFrame.NumFaces;i++)
  1765.     {
  1766.         
  1767.         //ak je face otoceny k svetlu vynechaj
  1768.         if (( ModelFrame.FaceList[i].Plane.Normal.X*LightPos.X + 
  1769.               ModelFrame.FaceList[i].Plane.Normal.Y*LightPos.Y + 
  1770.               ModelFrame.FaceList[i].Plane.Normal.Z*LightPos.Z + 
  1771.               ModelFrame.FaceList[i].Plane.D) <= 0.0f)
  1772.               continue;
  1773.  
  1774.         Stn->AddEdge(ModelFrame.FaceList[i].P[0],ModelFrame.FaceList[i].P[1]);
  1775.         Stn->AddEdge(ModelFrame.FaceList[i].P[1],ModelFrame.FaceList[i].P[2]);
  1776.         Stn->AddEdge(ModelFrame.FaceList[i].P[2],ModelFrame.FaceList[i].P[0]);
  1777.           
  1778.     }
  1779.  
  1780.     //vyberie quady ktore su nakraji
  1781.     Stn->ProcessEdge(LightPos);
  1782.  
  1783.     //vyrenderuje hotovy tien
  1784.     Stn->RenderShadow();
  1785.  
  1786. }